/* 
 * File:   FileService.h
 * Author: max
 *
 * Created on October 22, 2012, 4:58 AM
 */

#ifndef FILESERVICE_H
#define	FILESERVICE_H

#include <iostream>
#include <pthread.h>
#include <fstream>
#include <map>
#include <vector>
#include <map>
#include "server_IMensajero.h"
#include "server_IMensajeEntranteManejador.h"
#include "server_Proceso.h"
#include "server_Service.h"
#include "server_IAdministradorRepositorioCentral.h"
#include "common_FileServiceConstants.h"
#include "common_Mutex.h"
#include "common_Repositorio.h"
#include "common_FileUtils.h"
#include "common_Codec.h"


using namespace std;
using namespace TP;
using namespace TP::Comunicacion;
using namespace TP::Archivos;
using namespace TP::Comunicacion::Eventos;

namespace TP { namespace Servicios {

#define NOMBRE_ARCHIVO_REPOSITORIO_SERIALIZADO "repositorio.xml"
#define EXTENSION_ARCHIVO_DECLARACION ".tmp"    
    
class FileService : public Service, public IMensajeEntranteManejador {

    public:

        FileService(IAdministradorRepositorioCentral *pAdministradorRepositorioCentral);

        virtual ~FileService();
        
        void Iniciar() throw (Excepcion&);
        
        void Finalizar() throw (Excepcion&);
        
        void mensajeEntranteManejador (IMensajero* pMensajero, const string& pMensaje);
        
    private:       

        void responderEco(IMensajero* pMensajero, vector<string> &pComando);
        
        void declareFile(IMensajero* pMensajero, vector<string> &pComando);
        
        void deleteFile(IMensajero* pMensajero, vector<string> &pComando);
        
        void putFileChunk(IMensajero* pMensajero, vector<string> &pComando);
        
        void defineFile(IMensajero* pMensajero, vector<string> &pComando);  
        
        void getRepositorio (IMensajero* pMensajero, vector<string> &pComando);
        
        void getChunk (IMensajero* pMensajero, vector<string> &pComando);
        
        Repositorio* GetRepositorio(const string &pNombreUsuario);
        
        void notificarErrorEjecucion (IMensajero* pMensajero, vector<string> &pComando, const string &pAccion,  const string &pCodigoError, const string &pError);
        
        IAdministradorRepositorioCentral *_admRepositorioCentral;
        FileUtils _fileUtils;
        Codec _codec;                
    };

}}

#endif	/* FILESERVICE_H */

